import axios from 'axios'
import { Message } from 'element-ui'
import store from '@/store'
import { getToken } from '@/utils/auth'
import router from '@/router'

console.log(process.env)
// 创建axios实例
const service = axios.create({
  // baseURL: process.env.VUE_APP_BASE_API,
  baseURL: '/mock-api',
  timeout: 5 * 60 * 1000
})
// axios.defaults.headers.post['Content-Type']= 'application/json;charset=utf-8'

// 请求拦截器interceptor
service.interceptors.request.use(
  (config) => {
    // 请求发送前做的事

    if (store.getters.token) {
      // 一般使用['Token']作为后台token接收header参数
      config.headers.Token = getToken()
    }
    return config
  },
  (error) => {
    // 处理请求error
    console.log(error)
    return Promise.reject(error)
  }
)

// 请求响应拦截器interceptor
service.interceptors.response.use(
  /**
   * 假如你想获取整个http返回信息比如headers或status
   * 请直接 return  response => response
   */

  /**
   * 如下是根据项目的实际情况返回值写的通用处理
   * 不是所有的项目通用，需要跟后端商量返回对象
   * 当前后端返回 {code: code, msg: msg, data: {}}类似这样的数据
   */
  (response) => {
    const res = response.data

    // 通用数据对象code为0正常返回，否则报错
    if (res.code !== 0) {
      Message({
        message: res.message || 'Error',
        type: 'error',
        duration: 5 * 1000
      })

      let errmsg = ''
      switch (response.status) {
        // :TODO 处理超时时回到登录页面
        case 400:
          // oauth 认证失败后，返回400错误，直接放行，在login页面展示错误信息
          break
        case 401:
          errmsg = '登录超时'
          router.push('/login')
          break
        case 403:
          errmsg = `访问被拒绝！错误返回码：${response.status}`
          break
        case 404:
          errmsg = `找不到访问地址！错误返回码：${response.status}`
          break
        case 500:
          errmsg = `服务器错误！错误返回码：${response.status}`
          break
        default:
          errmsg = `出错了！错误返回码：${response.status}`
      }
      if (errmsg.length > 0) {
        Message({
          message: errmsg,
          type: 'error'
        })
      }
      return Promise.reject(new Error(res.message || 'Error'))
    } else {
      return Promise.resolve(res.data)
    }
  },
  (error) => {
    console.log('err' + error) // for debug
    Message({
      message: error.message,
      type: 'error',
      duration: 5 * 1000
    })
    return Promise.reject(error)
  }
)

export default service
